R语言爬虫系列1|HTML基础与R语言解析
在众多的数据科学与网络技术中,louwill越来越发现大家对爬虫的兴趣要大于其他技术。微信上经常跑过来问我爬虫问题的同学不在少数,每次的问题除了具体的某个技术细节外,无外乎这个爬虫需求能否用R实现,那个爬虫操作能否用R搞定之类。每次碰到自己不能解决的,就只好说抱歉啊同学,你这个爬虫需求好像R爬虫不能解决哦,要不要用一下Python呢。
就这么一来二去,次数多了,louwill自己也疑惑。毕竟自己对于R语言也只能算个半吊子,对于R爬虫更是只会Rcurl和rvest两个包,我就想啊,难道R语言真的不能像Python那样对于大家各色各样的爬虫需求有个完整的解决方案?对于非结构的网页抓取真的就不能很好的处理?在碰到无规律的url的时候,R爬虫进行翻页抓取就那么困难吗?在Python爬虫中用到的AJAX和Selenium技术R就不能也搞一搞?
带着这些疑问,louwill决心好好研究一番,即使最后得出了R语言均不能解决上述疑问的结论,也好在下次再有同学问我问题的时候,可以把自己的在R语言爬虫这一块的研究结果充分自信地告诉他。为此,louwill又决定在公众号开一期专栏,名字就叫R语言爬虫系列,从基础的HTML、XML、JSON、XPath表达式、HTTP协议等爬虫支撑的网络技术开始讲起,争取让大家在R语言爬虫上面得到一个全面完整的解决方案。
话不多说,今天louwill就给大家介绍爬虫技术的第一个基础知识:HTML。作为网络前端技术最核心三大技术之一(HTML、CSS和JavaScript),HTML的重要性不言而喻。如果说前端开发过程是一个造房子的过程,那么HTML就是这所房子的骨架结构,从地基到天花板要结构明晰,而房子造好后的装修则是CSS,比如说给地板贴瓷砖,给墙壁贴墙纸这样。最后房子建好,晚上我们要开灯不是?这就是JavaScript。
先不管不顾的扯了这么多,那到底什么是HTML呢?它跟我们的R语言爬虫又有什么关系呢?HTML的全称叫做超文本标记语言(Hyper Text Markup Language),是一种用于在网页上展示内容的语言,讲道理呢HTML并不是一种编程语言,而是一种描述内容并定义其表征的标记语言。说白了就是,HTML只规定了网页的结构,让网页在哪里显示标题和内容,显示什么内容,至于怎么个显示法,HTML管不着。
HTML的语法规则
打开大家习惯使用的一款浏览器,随手打开一个网页,单击右键查看源文件,当前网页的HTML代码就展示在你眼前了。下面是统计之都首页的HTML代码一部分:
相较于编程语言的语法,HTML的语法堪称简单易懂又好学。简单而言,从结构上看,HTML是一个树形结构,从内容上而言HTML也就是标签、元素和属性这些内容,再稍微注意一下HTML的注释方式、保留字符和文档定义,一个简单的HTML知识概览你就了解了。
标签、元素和属性
HTML中标签指的是会指定其中包装的文本作为在浏览器分页的标题栏显示的标题,在实际语法中标签通常以一个< >符号包括起来,起始标签、内容和终止标签组合起来则成为元素,如下代码所示:
<title> Chinars | 统计之都 </title>起始标签和终止标签都用< > 符号包裹,以便和内容进行区分,不同的是终止标签会有一个/符号以示区别。一般而言,每个元素都有一个起始标签和终止标签,但也不是全部。比如说<br>标签表示换行,它就不需要一个</br>标签来表示终止。
常用的HTML标签如下表所示:
标签 | 描述 |
<a> | 定义锚 |
<meta> | 定义关于HTML文档的元信息 |
<link> | 定义文档与外部资源的关系 |
<code> | 定义计算机代码文本 |
<p> | 定义段落 |
<h1>-<h6> | 定义HTML标题 |
<div> | 定义文档中的节 |
<span> | 定义文档中的节 |
<form> | 定义供用户输入的HTML表单 |
<script> | 定义客户端脚本 |
更多标签请参考HTML手册http://www.w3school.com.cn/tags/
标签最重要的一个特性是属性。继续拿统计之都的首页HTML举个例子:
<a href="/chinar/chinar-2013/">第六届中国R语言会议</a>锚标签<a>能够把相关的文本(这里是“第六届中国R语言会议”)和一个指向另一个地址的超链接关联起来。href="/chinar/chinar-2013/"这个属性指定锚链接,浏览器会自动把这类元素转化为带有下划线并且可以点击的样式。总而言之,属性就是让标签能够描述其内容处理方式的选项。具体属性的作用则根据相应的标签来定。
属性总是处于起始标签的内部,标签名的右侧,一个标签拥有多个属性也是常见操作,多个属性之间用空格分开。就像下面这样:
<div><img src="https://uploads.cosx.org/2010/10/SHUFE_map.jpg" alt="Thumbnail" /></div>树形结构
就像文档结构图一样,HTML最大的一个特点就是它呈现出树形结构的样子。先看一个简单的HTML结构示例:
<!DOCTYPE html><html>
<head>
<title> Chinars | 统计之都 </title>
</head>
<body>
第10届中国R会议简介
</body>
</html>
<!DOCTYPE html>是文档定义类型标签,忽略这个的话这个例子的第一个元素是<html>元素,在这个元素的起始和终止标签内,又有几个标签分别起始和终止:<head><title>和<body>。<head>和<body>标签是直接被<html>元素包含的,<title>标签则包含在<head>标签内。一个典型的树形结构就这样被描述出来了。
在结构良好并且合法的HTML文件中,所有元素相互之间必须是严格嵌套的。一对起始标签和终止标签必须完全包含在另一对起始和终止标签内。
HTML除了以上这些基本知识,还有一些包括注释、保留字符和特殊字符、文档定义类型以及其他等细节知识值得注意的,在这里louwill就不再一一罗列了。对于要学习爬虫的同学而言,哪怕是任一门编程语言,在此之前都应该认真学习一下HTML,对于后续的爬虫的学习理解是非常有帮助的。
R语言中HTML的解析
所谓解析,是为了获得有用的HTML文件表征,运用一个能够理解标记结构特殊含义的程序、并在某个R的专用数据结构内部重建HTML文件隐含的层次结构,而不是仅仅读取。在R语言中,我们通常使用XML包中的htmlParse函数来解析一个HTML文件,XML有着与以C语言为基础的libxml2库的接口,功能十分强大。且看简单的R代码示例:
library(XML)url <- "http://www.r-datacollection.com/materials/html/JavaScript.html"
exmaple1 <- htmlParse(file = url)
print(example1)
解析后的HTML在R中打印出来:
<!DOCTYPE html>
<html>
<head>
<link rel="shortcut icon" href="htmlresources/javascript.ico" type="image/x-icon">
<title>J-J-Java-Script</title>
<style type="text/css">
p.over {background-color:black;color:white;font-family:"Comic Sans MS";font-size:120%}
p.out {font-family:"Comic Sans MS";font-size:120%}
</style>
</head>
<body>
<h1 id="heading">JavaScript Examples - Ho!</h1>
<br><h2>Plain and Simple Internal JavaScript Usage</h2>
<p>What was the time and date again? ... <script> document.write( Date() ); </script></p>
<br><h2>... And a Little Bit More Dynamic</h2>
<p>What was the time and date again? ... <span id="datefield"></span>
<script>
setInterval(function(){
document.getElementById("datefield").innerHTML = Date() ;
}, 1000);
</script></p>
<br><h2>Using External JavaScript-File</h2>
<p> Thanks to Peter-Paul Koch on <a href="http://www.quirksmode.org/js/detect.html">QuirksMode</a> we know what you are browsing with...<br><script src="htmlresources/browserdetect.js"></script><script>
document.write('<p class="accent">You\'re using '
+ BrowserDetect.browser + ' '
+ BrowserDetect.version + ' on '
+ BrowserDetect.OS + '!</script></p>');
<br><h2>Event Driven Usage of JavaScript</h2>
<p onmouseover="this.className='over'" onmouseout="this.className='out'">Hover Me!</p>
<br><h2>And another example (just in case...)</h2>
<p id="textfield"></p>
<p>Put in text and hit enter:<br><input id="textinput" type="text" size="30" maxlength="30" onchange='document.getElementById("textfield").innerHTML = document.getElementById("textinput").value;'></p>
</body>
</html>
这样一个完整的HTML文档就被解析到R中去了,htmlParse和其他DOM风格的解析器能够有效的执行解析任务,并将其转化为R语言中的一个对象。
HTML作为所有网络爬虫的起步知识,对于后面的爬虫理解和操作具有基础性的意义。虽然我们数据科学不是前端开发,但是掌握基本的web知识是非常有必要的。Louwill的R语言爬虫系列第一期HTML基础与R语言解析到这里就讲完了,下一期louwill将继续给大家介绍XML和JSON相关的内容,欢迎大家拍砖留言~
参考资料:
Automated Data Collection with R
往期精彩:
【机器学习】决策树总结|ID3 C4.5/C5.0 CHAID CART与QUEST
Python高级特性:切片、迭代、列表生成式、生成器与迭代器
一个数据科学狂热者的学习历程